﻿Public Class Autores
    Enum estado
        modificar
        insertar
        consultar
    End Enum

    Dim proximoId As Integer
    Dim datos As AccesoADatos
    Dim carga As ManejoDeCarga
    Dim editar As estado
    Dim id_cliente As Integer

    Private Sub Autores_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        datos = New AccesoADatos()
        carga = New ManejoDeCarga()
        carga_grilla("")
        modo(estado.consultar)
        ToolTip1.SetToolTip(Me.btn_nuevo, "Crear un nuevo registro")
        ToolTip1.SetToolTip(Me.btn_modificar, "Modificar el registro seleccionado")
        ToolTip1.SetToolTip(Me.btn_eliminar, "Eliminar el registro seleccionado")
        ToolTip1.SetToolTip(Me.btn_buscar, "Realizar búsqueda")
        ToolTip1.SetToolTip(Me.btn_cancelar, "Cancelar la operación actual")
        ToolTip1.SetToolTip(Me.btn_guardar, "Guardar los datos cargados")
        ToolTip1.SetToolTip(Me.btn_salir, "Salir del formulario")
    End Sub

    Private Sub carga_grilla(ByRef where As String)
        If where = "" Then
            carga.cargarGrilla(grd_autoresactuales, "apellido+', '+nombre AS 'Autor', nacionalidad AS 'Nacionalidad', id_autor", _
                               "Autor")
        Else
            carga.cargarGrilla(grd_autoresactuales, "a.apellido+ ', ' +a.nombre AS 'Autor', a.nacionalidad AS 'Nacionalidad', a.id_autor", _
                               "Autor a", where)
        End If
        grd_autoresactuales.Columns(2).Visible = False
    End Sub

    Private Sub modo(ByRef e As estado)
        editar = e
        Select Case e
            Case estado.consultar
                Me.txt_buscarapellido.Enabled = True
                Me.txt_buscarnombre.Enabled = True
                Me.btn_buscar.Enabled = True
                Me.grd_clientesActuales.Enabled = True
                pnl_controlesCarga.Enabled = True
                pnl_controlesConfirmacion.Enabled = False
                Me.txt_apellido.Enabled = False
                Me.txt_nombre.Enabled = False
                Me.txt_nacionalidad.Enabled = False
                btn_guardar.Enabled = False
                Exit Select
            Case estado.insertar
                Me.txt_buscarapellido.Enabled = False
                Me.txt_buscarnombre.Enabled = False
                Me.btn_buscar.Enabled = False
                Me.grd_clientesActuales.Enabled = True
                pnl_controlesCarga.Enabled = False
                pnl_controlesConfirmacion.Enabled = True
                Me.txt_apellido.Enabled = True
                Me.txt_nombre.Enabled = True
                Me.txt_nacionalidad.Enabled = True
                btn_guardar.Enabled = True
                Exit Select
            Case estado.modificar
                Me.txt_buscarapellido.Enabled = False
                Me.txt_buscarnombre.Enabled = False
                Me.btn_buscar.Enabled = False
                Me.grd_clientesActuales.Enabled = True
                pnl_controlesCarga.Enabled = False
                pnl_controlesConfirmacion.Enabled = True
                Me.txt_apellido.Enabled = True
                Me.txt_nombre.Enabled = True
                Me.txt_nacionalidad.Enabled = True
                btn_guardar.Enabled = True
                Exit Select
        End Select
    End Sub

    Private Sub btn_nuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_nuevo.Click
        Me.calcular_proximo_id()
        Me.modo(estado.insertar)
        Me.txt_apellido.Text = ""
        Me.txt_apellido.Focus()
    End Sub

    Private Sub calcular_proximo_id()
        Dim tabla As New Data.DataTable
        tabla = datos.leerTabla("MAX(id_autor)", "Autor")
        proximoId = tabla.Rows(0)(0) + 1
    End Sub

    Private Sub btn_modificar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_modificar.Click
        modo(estado.modificar)
        Dim pk As Integer = Me.grd_autoresactuales.CurrentRow.Cells(2).Value
        Dim dt As New Data.DataTable
        dt = datos.leerTabla("*", "Autor", "id_autor = " & pk)
        Me.txt_nombre.Text = dt.Rows(0)("nombre")
        Me.txt_apellido.Text = dt.Rows(0)("apellido")
        Me.txt_nacionalidad.Text = dt.Rows(0)("nacionalidad")
        Me.txtpk.Text = pk
    End Sub

    Private Sub btn_Eliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_eliminar.Click
        If MessageBox.Show("¿Esta seguro que desea borrar el autor seleccionado?", "Importante", _
                                            MessageBoxButtons.YesNo, MessageBoxIcon.Warning) = Windows.Forms.DialogResult.Yes Then
            datos.borrarRegistro("Autor", "id_autor", Me.grd_autoresactuales.CurrentRow.Cells(2).Value)
            modo(estado.consultar)
            limpiar_campos()
        End If
    End Sub

    Private Sub limpiar_campos()
        txt_nombre.Clear()
        txt_apellido.Clear()
        txt_nacionalidad.Clear()
        txt_buscarnombre.Clear()
        txt_buscarapellido.Clear()
        carga_grilla("")
    End Sub

    Private Sub btn_cancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_cancelar.Click
        Dim mensaje As String = "¿Esta seguro que desea cancelar la operación actual?"
        If editar = estado.consultar Then
            mensaje = "¿Cancelar la búsqueda?"
        End If
        If MessageBox.Show(mensaje, "Confirmación", MessageBoxButtons.YesNo, _
                           MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
            modo(estado.consultar)
            limpiar_campos()
        End If
    End Sub

    Private Sub btn_guardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_guardar.Click
        If validar_carga() Then
            If editar = estado.insertar Then
                If insertar_autor() Then
                    modo(estado.consultar)
                    limpiar_campos()
                    proximoId += 1
                    MessageBox.Show("Autor agregado correctamente", "Operación exitosa", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End If
            Else
                If modificar_autor() Then
                    modo(estado.consultar)
                    limpiar_campos()
                    MessageBox.Show("Autor modificado correctamente", "Operación exitosa", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End If
            End If
        End If
    End Sub

    Private Function validar_carga() As Boolean
        If validar_vacios() Then
            If validar_contenido() Then
                Return True
            End If
        End If
        Return False
    End Function

    Private Function validar_existencia() As Boolean
        If datos.leerTabla("*", "Autor", "nombre= '" & txt_nombre.Text & "' and apellido = '" & txt_apellido.Text & "'").Rows.Count() <> 0 Then
            MessageBox.Show("Ya existe un autor con el nombre y apellido indicados", "Autor no agregado", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If
        Return True
    End Function

    Private Function validar_vacios() As Boolean
        Dim validacion As Boolean = True
        If txt_nombre.Text = "" Or txt_apellido.Text = "" Or txt_nacionalidad.Text = "" _
             Then
            MessageBox.Show("Debe completar todos los campos", "Autor no agregado", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            validacion = False
        End If
        Return validacion
    End Function

    Private Function validar_contenido() As Boolean
        If IsNumeric(txt_nombre.Text) Then
            MessageBox.Show("El nombre debe ser texto", "Autor no agregado", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If
        If txt_nombre.Text.Length > 30 Then
            MessageBox.Show("El nombre es demasiado largo", "Autor no agregado", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If
        If IsNumeric(txt_apellido.Text) Then
            MessageBox.Show("El apellido debe ser texto", "Autor no agregado", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If
        If txt_nombre.Text.Length > 30 Then
            MessageBox.Show("El apellido es demasiado largo", "Autor no agregado", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If
        If IsNumeric(txt_nacionalidad.Text) Then
            MessageBox.Show("La nacionalidad debe ser texto", "Autor no agregado", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If
        If txt_nombre.Text.Length > 30 Then
            MessageBox.Show("La nacionalidad es demasiado larga", "Autor no agregado", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If

        Return True
    End Function

    Private Function insertar_autor() As Boolean
        Dim exito As Boolean = True
        If validar_existencia() Then
            Dim valores As String = proximoId & ", '" & Me.txt_nombre.Text & "', '" & Me.txt_apellido.Text & "', '" & Me.txt_nacionalidad.Text & "'"
            Try
                datos.insertarRegistro("Autor", valores)
            Catch ex As OleDb.OleDbException
                exito = False
                MessageBox.Show("Error cargando al autor en la base de datos", "Autor no agregado", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        Else
            exito = False
        End If
        Return exito
    End Function

    Private Function modificar_autor() As Boolean
        Dim exito As Boolean = True
        Dim valores As String
        valores = "nombre = '" & Me.txt_nombre.Text & "'"
        valores &= ", apellido = '" & Me.txt_apellido.Text & "'"
        valores &= ", nacionalidad = '" & Me.txt_nacionalidad.Text & "'"

        'Try
        datos.modificarRegistro("Autor", valores, "id_autor", txtpk.Text)
        'Catch ex As OleDb.OleDbException
        '    exito = False
        '    MessageBox.Show("Debe completar los campos correctamente", "Cliente no modificado", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        'End Try
        Return exito
    End Function

    Private Sub btn_buscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_buscar.Click
        If validar_campos_de_busqueda() Then
            Dim clausulas As Integer = 0
            Dim where As String = ""
            If txt_buscarnombre.Text <> "" Then
                If validarBuscarNombre() Then
                    where = "nombre LIKE '%" & txt_buscarnombre.Text & "%'"
                    clausulas += 1
                End If
            End If
            If txt_buscarapellido.Text <> "" Then
                If validarBuscarApellido() Then
                    If (clausulas > 0) Then
                        where &= " and apellido LIKE '%" & txt_buscarapellido.Text & "%'"
                        clausulas += 1
                    Else
                        where = "apellido LIKE '%" & txt_buscarapellido.Text & "%'"
                    End If
                End If
            End If
            Try
                carga_grilla(where)
                pnl_controlesConfirmacion.Enabled = True
            Catch ex As OleDb.OleDbException
                MessageBox.Show("Debe completar los campos correctamente", "Error de búsqueda", MessageBoxButtons.OK, MessageBoxIcon.Warning)
                limpiar_campos()
            End Try
        End If
    End Sub
    Private Function validarBuscarNombre() As Boolean
        If IsNumeric(txt_buscarNombre.Text) Then
            MessageBox.Show("El nombre debe ser texto", "Búsqueda no realizada", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If
        Return True
    End Function
    Private Function validarBuscarApellido() As Boolean
        If IsNumeric(txt_buscarapellido.Text) Then
            MessageBox.Show("El apellido debe ser texto", "Búsqueda no realizada", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If
        Return True
    End Function
    Private Function validar_campos_de_busqueda() As Boolean
        Dim validacion As Boolean = True
        If txt_buscarnombre.Text = "" And txt_buscarapellido.Text = "" Then
            MessageBox.Show("Debe completar al menos un campo de búsqueda", "Error en la búsqueda", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            validacion = False
        End If
        Return validacion
    End Function

    Private Sub btn_salir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_salir.Click
        If System.Windows.Forms.DialogResult.OK = MessageBox.Show("Cerrar esta ventana?", "Importante", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) Then
            Me.Close()
        End If
    End Sub

End Class